Redis 类。

<?php

class RedisClient
{
    private static $config = array(
        'master' => array(
            'host' => '127.0.0.1',
            'port' => 6379,
            'pass' => false,
        ),
        'slave' => array(
            'host' => '127.0.0.1',
            'port' => 6379,
            'pass' => false,
        ),
    );

    private static $methods_run_at_master = array(
        'append', 'decr', 'decrby', 'getset', 'incr', 'incrby', 'incrbyfloat',
        'mset', 'msetnx', 'set', 'setbit', 'setex', 'psetex', 'setnx', 'setrange',
        'del', 'delete', 'expire', 'settimeout', 'pexpire', 'expireat', 'pexpireat',
        'migrate', 'move', 'persist', 'rename', 'renamekey', 'renamenx', 'restore',
        'hdel', 'hincrby', 'hincrby', 'hset', 'hsetnx', 'hmset',
        'blpop', 'brpop', 'brpoplpush', 'linsert', 'lpop', 'lpush', 'lpushx', 'lrem',
        'lremove', 'lset', 'ltrim', 'listtrim', 'rpop', 'rpoplpush', 'rpush', 'rpushx',
        'sadd', 'sdiffstore', 'sinterstore', 'smove', 'spop', 'srem', 'sremove', 'sunionstore',
        'zadd', 'zincrby', 'zinter', 'zrem', 'zdelete', 'zremrangebyrank',
        'zdeleterangebyrank', 'zremrangebyscore', 'zdeleterangebyscore', 'zunion',
    );

    public function setConfig($type, $host, $port = 6379, $pass = false)
    {
        self::$config[$type] = array(
            'host' => $host,
            'port' => $port,
            'pass' => $pass,
        );

        return $this;
    }

    public function setMasterConfig($host, $port = 6379, $pass = false)
    {
        $this->setConfig('master', $host, $port, $pass);

        return $this;
    }

    public function setSlaveConfig($host, $port = 6379, $pass = false)
    {
        $this->setConfig('slave', $host, $port, $pass);

        return $this;
    }

    public function select($type)
    {
        static $instances = array();

        if (isset($instances[$type])) {
            return $instances[$type];
        }

        $config = self::$config[$type];

        $redis = new Redis;
        $redis->connect($config['host'], $config['port']);

        if ($config['pass']) {
            $redis->auth($config['pass']);
        }

        $instances[$type] = $redis;

        return $redis;
    }

    public function __call($method, $arguments)
    {
        if (DEBUG_MODE || PHP_SAPI == 'cli' || in_array(strtolower($method), self::$methods_run_at_master)) {
            $type = 'master';
        } else {
            $type = 'slave';
        }

        $redis = $this->select($type);

        return call_user_func_array(array($redis, $method), $arguments);
    }

}


vboy1010
912 声望35 粉丝

清泉石上流